namespace SmartMathLibrary.Geometry
{
    /// <summary>
    /// An interface to implement a Triangle3D.
    /// </summary>
    public interface ITriangle3D
    {
        /// <summary>
        /// Gets or sets the first point of the triangle.
        /// </summary>
        /// <value>The first point of the triangle.</value>
        Point3D PointA { get; set; }

        /// <summary>
        /// Gets or sets the second point of the triangle.
        /// </summary>
        /// <value>The second point of the triangle.</value>
        Point3D PointB { get; set; }

        /// <summary>
        /// Gets or sets the third point of the triangle.
        /// </summary>
        /// <value>The third point of the triangle.</value>
        Point3D PointC { get; set; }

        /// <summary>
        /// Scales the triangle by a specified scale factor.
        /// </summary>
        /// <param name="scaleFactor">The scale factor.</param>
        void ScaleTriangle(double scaleFactor);

        /// <summary>
        /// Scales the triangle by three specified scale factors. Each for one axis (x, y and z axis).
        /// </summary>
        /// <param name="scaleFactorX">The scale factor for the x axis.</param>
        /// <param name="scaleFactorY">The scale factor for the y axis.</param>
        /// <param name="scaleFactorZ">The scale factor for the z axis.</param>
        void ScaleTriangle(double scaleFactorX, double scaleFactorY, double scaleFactorZ);

        /// <summary>
        /// Translates the triangle with a specified translate value.
        /// </summary>
        /// <param name="translateValue">The translate value.</param>
        void TranslateTriangle(double translateValue);

        /// <summary>
        /// Translates the triangle with three specified translate values.
        /// </summary>
        /// <param name="translateValueX">The translate value for the x-axis.</param>
        /// <param name="translateValueY">The translate value for the y-axis.</param>
        /// <param name="translateValueZ">The translate value for the z-axis.</param>
        void TranslateTriangle(double translateValueX, double translateValueY, double translateValueZ);

        /// <summary>
        /// Compares the current instance of a triangle with another triangle object. 
        /// </summary>
        /// <param name="compare">The triangle to compare.</param>
        /// <returns>True if the position of the triangles are even otherwise the method will 
        /// return false.</returns>
        bool CompareTo(Triangle3D compare);
    }
}